import numpy as np 

# 仅包含前向传播的层
class Sigmoid:
    def __init__(self):
        self.params = []
    def forward(self,x):
        return 1/(1+np.exp(-x))
    
class Affine:
    def __init__(self,W,b):
        self.params = [W,b]

    def forward(self,x):
        W,b = self.params
        out = np.dot(x,W) + b 
        return out 
    
# 使用上面定义的层，构建一个网络模型
class TwoLayerNet:
    """简单神经网络模型
    
    parameters
    -------------
    input_size: 输入神经元个数（由输入数据特征个数决定）
    hidden_size: 隐藏神经元个数（可以根据需要取）
    output_size: 输出神经元个数 （由网络任务决定，如果是分类，就是分类个数）
    """
    def __init__(self,input_size,hidden_size,output_size):
        # 初始化权重和偏置
        W1 = np.random.randn(input_size,hidden_size)
        b1 = np.random.randn(hidden_size)
        W2 = np.random.randn(hidden_size,output_size)
        b2 = np.random.randn(output_size)

        # 生产层
        self.layers = [
            Affine(W1,b1),
            Sigmoid(),
            Affine(W2,b2)
        ]

        # 将所有的权重整理到列表中
        self.params=[]
        for layer in self.layers:
            self.params += layer.params

        # 模型最重要的功能--预测
        # 就是给定一个输入，根据给定的各个参数，进行计算预测
    def predict(self,x):
        # 通过一个个层进行计算，
        # 上一个层的输出作为下一个层的输入
        for layer in self.layers:
            x = layer.forward(x)
        return x 
        
if __name__ == '__main__':
    x = np.random.randn(10,2)
    model = TwoLayerNet(2,4,3)
    s = model.predict(x)
    print(s)

